package com.zwh.algorithm.leetcode.medium;

import java.util.Arrays;

public class LeetCode979 {
    /**
     * 2023-07-14 在二叉树中分配硬币
     * todo 给定一个有 N 个结点的二叉树的根结点 root，树中的每个结点上都对应有 node.val 枚硬币，并且总共有 N 枚硬币。
     * todo 在一次移动中，我们可以选择两个相邻的结点，然后将一枚硬币从其中一个结点移动到另一个结点。(移动可以是从父结点到子结点，或者从子结点移动到父结点。)。
     * todo 返回使每个结点上只有一枚硬币所需的移动次数。
     */
    public static void main(String[] args) {
        TreeNode treeNode1 = new TreeNode(0);
        TreeNode treeNode2 = new TreeNode(0);
        TreeNode treeNode3 = new TreeNode(3,treeNode1,treeNode2);
        System.out.println(distributeCoins(treeNode3));
    }
    static int move = 0;
    /**
     * 深度优先搜索
     * @param root
     * @return
     */
    public static int distributeCoins(TreeNode root) {
        dfs(root);
        return move;
    }
    public static int  dfs(TreeNode root){
        int moveleft = 0;
        int moveright = 0;
        if (root == null){
            return 0;
        }
        if (root.left != null){
            moveleft = dfs(root.left);
        }
        if (root.right != null){
            moveright = dfs(root.right);
        }
        move += Math.abs(moveleft) + Math.abs(moveright);
        return moveleft + moveright +root.val -1;
    }

  static class TreeNode {
      int val;
      TreeNode left;
      TreeNode right;
      TreeNode() {}
      TreeNode(int val) { this.val = val; }
      TreeNode(int val, TreeNode left, TreeNode right) {
          this.val = val;
          this.left = left;
          this.right = right;
      }
  }

}
